/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package sessions;

import entities.Client;
import entities.Commentaire;
import entities.Commercant;
import entities.Enseigne;
import entities.Note;
import entities.Utilisateur;
import java.util.ArrayList;
import java.util.List;
import javax.ejb.EJB;
import javax.ejb.LocalBean;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

/**
 *
 * @author Sangre
 */
@Stateless
@LocalBean
public class GestionnaireUtilisateur {

    @PersistenceContext(unitName = "TheCityRater-ejbPU")
    private EntityManager em;
    @EJB
    private GestionnaireEnseigne gestionnaireEnseigne;

    public void creerUtilisateur(Utilisateur user) {
        
        persist(user);
    }

    public void persist(Object object) {
        em.persist(object);
    }

    public List<Utilisateur> getUsers() {
        Query q = em.createQuery("Select u from Utilisateur u");
        return q.getResultList();
    }
    
    public List<Client> getClients() {
        Query q = em.createQuery("Select c from Client c");
        return q.getResultList();
    }
    
    public List<Commercant> getCommercants() {
        Query q = em.createQuery("Select c from Commercant c");
        return q.getResultList();
    }

    public Utilisateur getUtilisateurById(Long id) {
        Query q = em.createQuery("Select u from Utilisateur u where u.id = :id");
        q.setParameter("id", id);
        return (Utilisateur) q.getSingleResult();
    }
    
    public Utilisateur getUtilisateurById(Long id, String type) {
        Query q = em.createQuery("Select u from "+type+" u where u.id = :id");
        q.setParameter("id", id);
        return (Utilisateur) q.getSingleResult();
    }

    public int getCount(String type) {
        return Integer.parseInt(em.createNamedQuery(type + ".count").getSingleResult().toString());
    }

    public List<Utilisateur> getUsers(String type, int start, int nbUsers, String sortField, String sortOrder) {
        Query q;
        if (sortField == null) {
            q = em.createNamedQuery(type + ".findAll");
        } else {
            q = em.createQuery("SELECT c FROM " + type + " c ORDER BY c." + sortField + " " + sortOrder);
        }
        q.setFirstResult(start);
        q.setMaxResults(nbUsers);

        return q.getResultList();
    }

    public Utilisateur getUtilisateur(Long id, String type) {
        Query q = em.createQuery("Select u from " + type + " u where u.id = :id");
        q.setParameter("id", id);
        return (Utilisateur) q.getSingleResult();
    }

    public Utilisateur getUtilisateur(String login, String mdp, String type) {
        try {
            if (type == null)
                type = "Utilisateur";
            Query q = em.createQuery("Select u from " + type + " u where u.login = :login and u.motDePasse = :motDePasse");
            q.setParameter("login", login);
            q.setParameter("motDePasse", mdp);
            return (Utilisateur) q.getSingleResult();
        } catch (Exception e) {
            System.out.print(e.getLocalizedMessage());
            return null;
        }
    }

    public Utilisateur getUtilisateurByLogin(String login) {
        try {
            Query q = em.createQuery("Select u from Utilisateur u where u.login = :login");
            q.setParameter("login", login);
            return (Utilisateur) q.getSingleResult();
        } catch (Exception e) {
            return null;
        }
    }
    
    public Utilisateur getUtilisateurByEmail(String email) {
        try {
            Query q = em.createQuery("Select u from Utilisateur u where u.email = :email");
            q.setParameter("email", email);
            return (Utilisateur) q.getSingleResult();
        } catch (Exception e) {
            return null;
        }
    }

    public void supprimerUser(Utilisateur user) {
        em.remove(em.merge(user));
    }

    public void modifierUser(Utilisateur user) {
        em.merge(user);
    }

    public void addFavoris(Enseigne e, Client u)
    {
        u.getFavoris().add(e);
        em.merge(u);
    }
    
    public void removeFavoris(Enseigne e, Client u)
    {
        u.getFavoris().remove(e);
        modifierUser(u);
    }
    
    /////////// PARTIE COMM \\\\\\\\\\\\
    public List<Commentaire> getCommentaires(Long idUser) {
        Client user = (Client) getUtilisateur(idUser, "Client");
        return (List<Commentaire>) user;
    }

    public void addCommentaire(Long idUser, Commentaire comm) {
        Client user = (Client) getUtilisateur(idUser, "Client");
        user.getCommentaires().add(comm);
        em.merge(user);
    }

    public Commentaire getCommentaire(Long idComm) {
        Query q = em.createQuery("select a from Actualite A where a.id = :idA");
        q.setParameter("idA", idComm);
        return (Commentaire) q.getSingleResult();
    }

    public void deleteCommentaire(Long idComm) {
        em.remove(em.merge(getCommentaire(idComm)));
    }
    
    public void ajouterEnseigneToCommercant(Enseigne e, Long iDCommercant) {
        Commercant commercant = (Commercant) getUtilisateur(iDCommercant, "Commercant");
        gestionnaireEnseigne.creerEnseigne(e);
        System.out.println("Commercant "+commercant.getLogin());
        e.setCommercant(commercant);
        gestionnaireEnseigne.enseigneUpdate(e);
        modifierUser(commercant);
    }
    
}